【AWS CDK】LambdaのL1コンストラクトでlambda.Codeクラスを使ってデプロイする
データアナリティクス事業本部のueharaです。
今回は、AWS CDKにおいてLambdaのL1コンストラクトで lambda.Code
クラスを使ってデプロイしてみたいと思います。
はじめに
AWS CDKにはCloudFormationスタックからAWS CDKへ移行を行うCDK Migrateがあります。
ただ、CDK Migrateで移行した場合は全てL1コンストラクトで定義されており、Lambda関数においては cdk migrate
コマンドを実行したタイミングでLambda関数のリソースがzip化されたファイルがS3にアップロードされ、それを参照する形となっています。
const hogeXxxLambdaFunction = new lambda.CfnFunction(this, 'HogeXxxLambdaFunction', {
code: {
s3Bucket: 'cdk-test-deploy',
s3Key: 'foo/bar/1718863334164-2024-07-24T06:02:14.164Z/HogeXxx.zip',
},
handler: 'handler/hoge_xxx.lambda_handler',
runtime: 'python3.9',
functionName: 'hoge-xxx-lambda',
memorySize: 5140,
timeout: 900,
ephemeralStorage: {
size: 2048,
},
role: LambdaRoleArn
});
ただ、この状態でそのまま運用してしまうと、仮にソース修正が入った場合変更に更新に一手間かかります。
できれば、code
部分だけでも修正を行い、L2コンストラクトのLambdaのように lambda.Code
クラスを使ってローカルのディレクトリを参照してデプロイする運用としたいです。
const hogeXxxLambdaFunction = new lambda.Function(this, 'HogeXxxLambdaFunction', {
functionName: 'hoge-xxx-lambda',
runtime: lambda.Runtime.PYTHON_3_9,
code: lambda.Code.fromAsset("resources/lambda"), // こんな感じ
handler: "hoge_xxx.lambda_handler",
memorySize: 5140,
timeout: cdk.Duration.seconds(900),
ephemeralStorageSize: Size.mebibytes(2048),
role: LambdaRole
});
ここで、L2コンストラクトのpropsの code
のtypeは lambda.Code
ですが、L1コンストラクトの code
のtypeは CfnFunction.CodeProperty
なので、L2クラスのようにそのまま渡してしまうとエラーとなります。
CDK Migrate(もといL1コンストラクトのLamda)を利用しつつ、今後もLambda関数に改修が入る可能性があるのであれば lambda.Code
クラスを使えた方が便利なので、以下ではL1コンストラクトと lambda.Code
クラスを一緒に使う方法を説明します。
対応方法
結論から言うと、LambdaのL2コンストラクタがL1コンストラクタをラップしている処理と同様に、 bind()
を利用することで対応できます。
const code = lambda.Code.fromAsset("resources/lambda").bind(this);
const hogeXxxLambdaFunction = new lambda.CfnFunction(this, 'HogeXxxLambdaFunction', {
code: {
s3Bucket: code.s3Location && code.s3Location.bucketName,
s3Key: code.s3Location && code.s3Location.objectKey,
},
handler: 'handler/hoge_xxx.lambda_handler',
runtime: 'python3.9',
functionName: 'hoge-xxx-lambda',
memorySize: 5140,
timeout: 900,
ephemeralStorage: {
size: 2048,
},
role: LambdaRoleArn
});
bind()
関数はこちらのソースの通り、S3バケットに資材をアップロードし、以下のような値をリターンしてくれます。
return {
s3Location: {
bucketName: this.asset.s3BucketName,
objectKey: this.asset.s3ObjectKey,
},
};
この値を CfnFunction.CodeProperty
としてL1コンストラクトのLamdaに渡してあげればやりたいことが実現できます。
最後に
今回は、AWS CDKにおいてLambdaのL1コンストラクトで lambda.Code
クラスを使ってデプロイしてしてみました。
参考になりましたら幸いです。